package com.fowo.api.mp.service;

import com.fowo.api.mp.model.*;

/**
 * 小程序相关服务
 */
public interface MiniProgramService {

    /**
     * 获取接口调用凭证
     * (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html)
     * @apiNote 获取的是服务端使用的调用凭证，不得公开到客户端，将会有严重安全问题
     */
    default String getAccessToken() {
        return getAccessToken(false);
    }

    /**
     * 获取接口调用凭证
     * (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html)
     * @apiNote 获取的是服务端使用的调用凭证，不得公开到客户端，将会有严重安全问题
     * @param forceUpdate 是否强制更新，访问的是调用次数限制接口，不要使用无条件的强制更新
     */
    String getAccessToken(boolean forceUpdate);

    /**
     * [小程序]登录凭证校验。通过 wx.login 接口获得临时登录凭证 code 后传到开发者服务器调用此接口完成登录流程。
     * (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/login/auth.code2Session.html)
     * @param code 登录时获取的 code
     * @return 授权结果
     */
    Code2SessionResult code2Session(String code);

    /**
     * 发送统一服务消息
     * (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/uniform-message/uniformMessage.send.html)
     * @return
     */
    WxResult sendMessage(WxUniformMessage message) throws Exception;

    /**
     * [小程序]获取小程序二维码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
     * (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.createQRCode.html)
     * @param path 小程序页面路径
     * @return 生成的图片的附件名
     */
    String createQRCode(String path) throws Exception;

    /**
     * [小程序]获取小程序码，适用于需要的码数量较少的业务场景。通过该接口生成的小程序码，永久有效，有数量限制
     * @return 生成的图片的附件名
     */
    String get(WxACodeRequest request) throws Exception;

    /**
     * [小程序]获取小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制。
     * @return 生成的图片的附件名
     */
    String getUnlimited(WxACodeUnlimitedRequest request) throws Exception;

    /**
     * [小程序]code换取用户手机号。 每个code只能使用一次，code的有效期为5min
     * @param code 手机号获取凭证
     * @return 获取手机号
     */
    PhoneInfoResult.PhoneInfo getPhoneNumber(String code) throws Exception;

    /**
     * [小程序]发送订阅消息
     * (https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.send.html)
     * @param message 订单消息
     * @return 发送结果
     */
    WxResult sendSubscribeMessage(WxSubscribeMessage message) throws Exception;
}
